home *** CD-ROM | disk | FTP | other *** search
/ IRIS Performer 2.2 Friends Demo / SGI IRIS Performer 2.2 Friends Demo.iso / friends / openworlds / tix / DirTree.tcl < prev    next >
Text File  |  1997-11-22  |  6KB  |  253 lines

  1. tixWidgetClass tixDirTree {
  2.     -classname TixDirTree
  3.     -superclass tixScrolledHList
  4.     -method {
  5.     chdir activate
  6.     }
  7.     -flag {
  8.     -browsecmd -command -directory -disablecallback -showhidden
  9.     }
  10.     -configspec {
  11.     {-browsecmd browseCmd BrowseCmd {}}
  12.     {-command command Command {}}
  13.     {-directory directory Directory {}}
  14.     {-disablecallback disableCallback DisableCallback false}
  15.     {-showhidden showHidden ShowHidden false}
  16.     }
  17.     -default {
  18.     {.scrollbar            auto}
  19.     {*Scrollbar.background          #d9d9d9}
  20.     {*Scrollbar.relief              sunken}
  21.     {*Scrollbar.takeFocus           0}
  22.     {*Scrollbar.troughColor         #c3c3c3}
  23.     {*Scrollbar.width               15}
  24.     {*borderWidth                   1}
  25.     {*hlist.background              #c3c3c3}
  26.     {*hlist.drawBranch              1}
  27.     {*hlist.height                  10}
  28.     {*hlist.highlightBacground      #d9d9d9}
  29.     {*hlist.indent                  15}
  30.     {*hlist.itemType                imagetext}
  31.     {*hlist.padX                    3}
  32.     {*hlist.padY                    0}
  33.     {*hlist.relief                  sunken}
  34.     {*hlist.takeFocus               1}
  35.     {*hlist.wideSelection           0}
  36.     {*hlist.width                   20}
  37.     }
  38. }
  39.  
  40. proc tixDirTree::InitWidgetRec {w} {
  41.     upvar #0 $w data
  42.  
  43.     tixChainMethod $w InitWidgetRec
  44.  
  45.     set data(oldDir) {{}}
  46.  
  47.     if {$data(-directory) == {}} {
  48.     global env
  49.     if {[info exists env(PWD)]} {
  50.         set data(-directory) $env(PWD)
  51.     } else {
  52.         set data(-directory) [pwd]
  53.     }
  54.     }
  55. }
  56.  
  57. proc tixDirTree::ConstructWidget {w} {
  58.     upvar #0 $w data
  59.  
  60.     tixChainMethod $w ConstructWidget
  61.     tixDoWhenIdle tixDirTree::StartUp $w
  62.  
  63.     $data(w:hlist) config \
  64.     -separator "/" \
  65.     -selectmode "single" -drawbranch 1
  66. }
  67.  
  68. proc tixDirTree::SetBindings {w} {
  69.     upvar #0 $w data
  70.  
  71.     tixChainMethod $w SetBindings
  72.  
  73.     $data(w:hlist) config \
  74.     -browsecmd "tixDirTree::Browse $w" \
  75.     -command "tixDirTree::ChangeDir $w"
  76.     bind $data(w:hlist) <3> "tixDirTree::DeleteSib $w %x %y"
  77. }
  78.  
  79. proc tixDirTree::DeleteSib {w x y} {
  80.     upvar #0 $w data
  81.  
  82.     set ent [$data(w:hlist) nearest $y]
  83.  
  84.     if {$ent != ""} {
  85.     $data(w:hlist) anchor set $ent
  86.  
  87.     for {set e $ent} {$e != "/"} {set e [$data(w:hlist) info parent $e]} {
  88.         $data(w:hlist) delete siblings $e
  89.     }
  90.     tixDirTree::Browse $w $ent
  91.     }
  92. }
  93.  
  94. proc tixDirTree::AddDir {w dir} {
  95.     upvar #0 $w data
  96.  
  97.     if [$data(w:hlist) info exists $dir] {
  98.     return
  99.     }
  100.  
  101.     if {$dir != "/"} {
  102.     set parentDir [file dirname $dir]
  103.     if {![$data(w:hlist) info exists $parentDir]} {
  104.         tixDirTree::AddDir $w $parentDir
  105.     }
  106.     $data(w:hlist) add $dir -text [file tail $dir] \
  107.         -image [tix getimage openfolder]
  108.  
  109.     $data(w:hlist) entryconfig $parentDir -data loaded
  110.     } else {
  111.     $data(w:hlist) add $dir -text / \
  112.         -image [tix getimage openfolder]
  113.     }
  114. }
  115.  
  116. proc tixDirTree::ListDirs {w dir} {
  117.     upvar #0 $w data
  118.  
  119.     set appPWD [pwd]
  120.  
  121.     if [catch {cd $data(-directory)} err] {
  122.     # The user has entered an invalid directory
  123.     # %% todo: prompt error, go back to last succeed directory
  124.     cd $appPWD
  125.     return
  126.     }
  127.  
  128.     if [tixGetBoolean -nocomplain $data(-showhidden)] {
  129.     if [catch {set names [lsort [glob -nocomplain * .*]]} err] {
  130.         # Cannot read directory
  131.         # %% todo: show directory permission denied
  132.         cd $appPWD
  133.         return
  134.     }
  135.     } else {
  136.     if [catch {set names [lsort [glob -nocomplain *]]} err] {
  137.         cd $appPWD
  138.         return
  139.     }
  140.     }
  141.  
  142.     set dirs 0
  143.  
  144.     foreach fname $names {
  145.     if {![string compare . $fname] || ![string compare .. $fname]} {
  146.         continue
  147.     }
  148.     if {$data(-directory) == "/"} {
  149.         set subdir /$fname
  150.     } else {
  151.         set subdir $data(-directory)/$fname
  152.     }
  153.     if [file isdirectory $subdir] {
  154.         $data(w:hlist) add $subdir -text $fname \
  155.         -image [tix getimage folder]
  156.         incr dirs
  157.     }
  158.     }
  159.  
  160.     if {$dirs > 0} {
  161.     $data(w:hlist) entryconfig $dir -data loaded
  162.     }
  163.  
  164.     cd $appPWD
  165. }
  166.  
  167. proc tixDirTree::LoadDir {w dir {mode toggle}} {
  168.     if {![winfo exists $w]} {
  169.     return
  170.     }
  171.  
  172.     upvar #0 $w data
  173.  
  174.     if {$data(oldDir) != {} && [$data(w:hlist) info exists $data(oldDir)]} {
  175.     if {[$data(w:hlist) info data $data(oldDir)] == {}} {
  176.         $data(w:hlist) entryconfig $data(oldDir) \
  177.         -image [tix getimage folder]
  178.     } else {
  179.         $data(w:hlist) entryconfig $data(oldDir) \
  180.         -image [tix getimage openfolder]
  181.     }
  182.     }
  183.  
  184.     # Add the directory and set it to the active directory
  185.     #
  186.     set data(oldDir) $dir
  187.     tixDirTree::AddDir $w $dir
  188.     $data(w:hlist) entryconfig $dir -image [tix getimage act_folder]
  189.  
  190.     if {$mode == "toggle"} {
  191.     if {[$data(w:hlist) info children $dir] == {}} {
  192.         set mode expand
  193.     } else {
  194.         set mode flatten
  195.     }
  196.     }
  197.  
  198.     if {$mode == "expand"} {
  199.     tixDirTree::ListDirs $w $dir
  200.     } else {
  201.     $data(w:hlist) delete offsprings $dir
  202.     }
  203. }
  204.  
  205. proc tixDirTree::ChangeDir {w value} {
  206.     upvar #0 $w data
  207.  
  208.     set data(-directory) $value
  209.     tixDoWhenIdle tixDirTree::LoadDir $w $value
  210.  
  211.     if {$data(-command) != {} && 
  212.     ![tixGetBoolean -nocomplain $data(-disablecallback)]} {
  213.     eval $data(-command) [list $data(-directory)]
  214.     }
  215. }
  216.  
  217. proc tixDirTree::StartUp {w} {
  218.     if {![winfo exists $w]} {
  219.     return
  220.     }
  221.  
  222.     upvar #0 $w data
  223.  
  224.     tixDirTree::LoadDir $w $data(-directory)
  225. }
  226.  
  227. proc tixDirTree::Browse {w dir} {
  228.     upvar #0 $w data
  229.  
  230.     if {$data(-browsecmd) != {}} {
  231.     eval $data(-browsecmd) [list $dir]
  232.     }
  233. }
  234.  
  235. # Public methods
  236. #
  237. #
  238. proc tixDirTree::chdir {w dir} {
  239.     upvar #0 $w data
  240.  
  241.     set data(-directory) $dir
  242.     tixDoWhenIdle tixDirTree::LoadDir $w $dir expand
  243.  
  244.     if {$data(-command) != {} && 
  245.     ![tixGetBoolean -nocomplain $data(-disablecallback)]} {
  246.     eval $data(-command) [list $data(-directory)]
  247.     }
  248. }
  249.  
  250. proc tixDirTree::config-directory {w value} {
  251.     tixDirTree::chdir $w $value
  252. }
  253.